
#pragma once
#ifndef TEST_PROJECT_RASP_SPOTNJ_H
#define TEST_PROJECT_RASP_SPOTNJ_H

//SPOTNJ模块使用说明

//1、SetMethod						设置使用的方法，0为最大值法，1位质心法
//2、SetDopplerNum					设置多普勒通道数
//3、SetRangeRangeThresholdNum		设置距离凝聚时，距离的门槛值（多少个距离单元以内凝聚）
//4、SetRangeDopplerThresholdNum		设置距离凝聚时，多普勒门槛值（多少个多普勒单元以内凝聚）
//5、SetAzi							设置当前时刻的角度值			单位弧度
//6、SetEle							设置当前时刻的俯仰值			单位弧度
//7、SetTime							设置当前时刻的时间值			单位秒
//8、SetIntervalTime					设置两个数据之间的时间间隔		单位秒
//9、SetAziThreshold					设置角度凝聚时，角度的门槛值（多少弧度以内凝聚）	单位弧度
//10、SetEleThreshold				设置角度凝聚时，俯仰的门槛值（多少弧度以内凝聚）	单位弧度
//11、SetNJCountNum					设置点迹凝聚时，点迹凝聚个数
//12、SetAziRangeThresholdNum		设置角度凝聚时，距离的门槛值（多少个距离单元以内凝聚）
//13、SetNetIPAddres					设置点迹发送目的的IP地址
//14、SetNetPort						设置点迹发送目的的端口号
//15、SetIsSendData					设置该模块是否发送点迹信息给目的地址
//16、SetRgate						设置距离门	单位：米
//17、DataProcess					计算函数：DataIn为输入值 DataOut为输出值
//									DataIn ：输入值第一个int为点的个数N，之后跟着N个TYPE_CFAROUT类型的结构体
//									DataOut：输出值第一个int为点的个数N，之后跟着N个PointInfo类型的结构体


#include <cassert>
#include <complex>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <vector>

#pragma comment(lib, "ws2_32.lib")

#include<string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdio.h>
#include <pthread.h>
#include <sys/ioctl.h>//for FIONBIO
#include <net/if.h>
#include <error.h>
#include <sys/wait.h>
#include <sys/time.h>
#include <unistd.h>
#include <semaphore.h>
#include <fcntl.h>
#include <ifaddrs.h>


class Rasp_SpotNJ {
private:
#pragma pack(1)
    struct SPOTNJ_STRUCT {
        float value_fuzhu;
        float backgroud_data;
        int dopplernum;
        int rangenum;
        float Azi;
        float Ele;
        float Time;
    };
    struct PointInfo {
        double Range;//距离
        double Angle;//角度
        double Envelope;//包络幅度
        double time_weight;//临时
        double time;//时间
        double interrupt;//间隔，临时变量
        int joint_flag;//标志位，临时变量
        double Ele;
        double doppler;
    };
    struct TYPE_CFAROUT {
        std::complex<float> value_cfuzhi;
        float value_fuzhu;
        float backgroud_data;
        int dopplernum;
        int rangenum;
        float Azi;
        float Ele;
    };
#pragma pack()

public:
    Rasp_SpotNJ();

    ~Rasp_SpotNJ();

    bool SetMethod(int method);

    bool SetDopplerNum(int DopplerNum);

    bool SetRangeRangeThresholdNum(int Range_range_ThresholdNum);

    bool SetRangeDopplerThresholdNum(int Range_doppler_ThresholdNum);

    bool SetAzi(float Azi);

    bool SetEle(float Ele);

    bool SetTime(float Time);

    bool SetIntervalTime(float intervalTime);

    bool SetAziThreshold(float Azi_Threshold);

    bool SetEleThreshold(float Ele_Threshold);

    bool SetNJCountNum(int count);

    bool SetAziRangeThresholdNum(int Azi_range_ThresholdNum);

    bool SetIsSendData(bool issend);

    bool SetRgate(float gate);

    void UnInit();

    int DataProcess(void *DataIn, int inLen, void *DataOut, int outLen, void *PPIOut);

private:
    int
    AngelCondesion(float Azi, std::vector<PointInfo> &pointout, std::vector<SPOTNJ_STRUCT> outdata, float Azi_Threshold,
                   float Ele_Threshold, int Azi_range_ThresholdNum, int NJ_SPOTNUM);

private:
#pragma pack(1)
    struct SpotSend {
        float Time;
        float Range;
        float Azimuth;
        float Elevation;
        float Velocity;
        float Hight;
        char Backup[20] = {0};
    };
#pragma pack()
    std::vector<PointInfo> pre_point_info;
    double m_preAzi;
    int m_Method;
    int m_DopplerNum;
    int m_Range_range_ThresholdNum;
    int m_Range_doppler_ThresholdNum;
    float m_Azi;//度
    float m_Ele;//度
    float m_Time;
    float m_Azi_Threshold;
    float m_Ele_Threshold;
    int m_Azi_range_ThresholdNum;
    int NJCountNum;
    unsigned int Num_Count;
    float m_IntervalTime;
    bool isSend;
    float Rgate;
};

#endif //TEST_PROJECT_RASP_SPOTNJ_H
